<?php

namespace CMS\Controller\Admin;

use Admin\Base\DocController as Controller;

/**
 * 模型数据管理控制器
 * 
 */
class ThinkController extends Controller
{

    /**
     * 显示指定模型列表数据
     * 
     * @param string $model 模型标识
     * @param int $p 当前页码
     */
    public function lists($model, $p = 0)
    {
        $model || $this->error('模型名标识必须！');
        $page = max(intval($p), 1);// 默认显示第一页数据
                                   
        // 获取模型信息
        $model = M('Model')->getByName($model);
        $model || $this->error('模型不存在！');
        
        // 解析列表规则
        $fields = array();
        $grids = trim($model['list_grid']);
        if (empty($grids)) {
            $grids = M('Model')->getFieldByName('document', 'list_grid');
        }
        
        $grids = preg_split('/[;\r\n]+/s', $grids);
        
        foreach ($grids as $key => $value) {
            if (trim($value) === '') {
                $grids[$key] = [];
                continue;
            }
            // 字段:标题:链接
            $val = explode(':', $grids[$key]);
            // 支持多个字段显示
            $field = explode(',', $val[0]);
            $grids[$key] = array(
                'field' => $field,
                'title' => $val[1]
            );
            if (isset($val[2])) {
                // 链接信息
                $grids[$key]['href'] = $val[2];
                // 搜索链接信息中的字段信息
                preg_replace_callback('/\[([a-z_]+)\]/', function ($match) use (&$fields) {
                    $fields[] = $match[1];
                }, $grids[$key]['href']);
            }
            if (strpos($val[1], '|')) {
                // 显示格式定义
                list ($grids[$key]['title'], $grids[$key]['format']) = explode('|', $val[1]);
            }
            foreach ($field as $val) {
                $array = explode('|', $val);
                $fields[] = $array[0];
            }
        }
        // 过滤重复字段信息
        $fields = array_unique($fields);
        // 关键字搜索
        $map = array();
        $key = $model['search_key'] ? $model['search_key'] : 'title';
        if (isset($_REQUEST[$key])) {
            $map[$key] = array(
                'like',
                '%' . $_GET[$key] . '%'
            );
            unset($_REQUEST[$key]);
        }
        // 条件搜索
        foreach ($_REQUEST as $name => $val) {
            if (in_array($name, $fields)) {
                $map[$name] = $val;
            }
        }
        $row = empty($model['list_row']) ? 10 : $model['list_row'];
        
        // 读取模型数据列表
        if ($model['extend']) {
            $name = get_table_name($model['id']);
            $parent = get_table_name($model['extend']);
            $fix = C("DB_PREFIX");
            
            $key = array_search('id', $fields);
            if (false === $key) {
                array_push($fields, "{$fix}{$parent}.id as id");
            } else {
                $fields[$key] = "{$fix}{$parent}.id as id";
            }
            
            /* 查询记录数 */
            $count = M($parent)->join("INNER JOIN {$fix}{$name} ON {$fix}{$parent}.id = {$fix}{$name}.id")
                ->where($map)
                ->count();
            
            // 查询数据
            $data = M($parent)->join("INNER JOIN {$fix}{$name} ON {$fix}{$parent}.id = {$fix}{$name}.id")
                /* 查询指定字段，不指定则查询所有字段 */
                ->field(empty($fields) ? true : $fields)
                ->
            // 查询条件
            where($map)
                /* 默认通过id逆序排列 */
                ->order("{$fix}{$parent}.id DESC")
                /* 数据分页 */
                ->page($page, $row)
                /* 执行查询 */
                ->select();
        } else {
            if ($model['need_pk']) {
                in_array('id', $fields) || array_push($fields, 'id');
            }
            $name = parse_name(get_table_name($model['id']), true);
            $data = M($name)
                /* 查询指定字段，不指定则查询所有字段 */
                ->field(empty($fields) ? true : $fields)
                ->
            // 查询条件
            where($map)
                /* 默认通过id逆序排列 */
                ->order($model['need_pk'] ? 'id DESC' : '')
                /* 数据分页 */
                ->page($page, $row)
                /* 执行查询 */
                ->select();
            
            /* 查询记录总数 */
            $count = M($name)->where($map)->count();
        }
        
        // 分页
        if ($count > $row) {
            $page = new \Think\Page($count, $row);
            $page->setConfig('theme', '%FIRST% %UP_PAGE% %LINK_PAGE% %DOWN_PAGE% %END% %HEADER%');
            $this->assign('_page', $page->show());
        }
        
        $data = $this->parseDocumentList($data, $model['id']);
        $this->assign('model', $model);
        $this->assign('list_grids', $grids);
        $this->assign('list_data', $data);
        $this->meta_title = $model['title'] . '列表';
        $this->display($model['template_list']);
    }

    public function del($model, $ids = null)
    {
        $model = M('Model')->find($model);
        $model || $this->error('模型不存在！');
        
        $ids = array_unique((array) I('ids', 0));
        
        if (empty($ids)) {
            $this->error('请选择要操作的数据!');
        }
        
        $Model = M(get_table_name($model['id']));
        $map = array(
            'id' => array(
                'in',
                $ids
            )
        );
        if ($Model->where($map)->delete()) {
            $this->success('删除成功');
        } else {
            $this->error('删除失败！');
        }
    }

    /**
     * 设置一条或者多条数据的状态
     * 
     */
    public function setStatus($model = 'Document')
    {
        return parent::setStatus($model);
    }

    public function edit($model, $id = 0)
    {
        // 获取模型信息
        $model = M('Model')->find($model);
        $model || $this->error('模型不存在！');
        
        if (IS_POST) {
            $Model = D(parse_name(get_table_name($model['id']), 1));
            // 获取模型的字段信息
            $Model = $this->checkAttr($Model, $model['id']);
            if ($Model->create() && $Model->save()) {
                $this->success('保存' . $model['title'] . '成功！', U('lists?model=' . $model['name']));
            } else {
                $this->error($Model->getError());
            }
        } else {
            $fields = get_model_attribute($model['id']);
            
            // 获取数据
            $data = M(get_table_name($model['id']))->find($id);
            $data || $this->error('数据不存在！');
            
            $this->assign('model', $model);
            $this->assign('fields', $fields);
            $this->assign('data', $data);
            $this->meta_title = '编辑' . $model['title'];
            $this->display($model['template_edit'] ? $model['template_edit'] : '');
        }
    }

    public function add($model)
    {
        // 获取模型信息
        $model = M('Model')->where(array(
            'status' => 1
        ))->find($model);
        $model || $this->error('模型不存在！');
        if (IS_POST) {
            $Model = D(parse_name(get_table_name($model['id']), 1));
            // 获取模型的字段信息
            $Model = $this->checkAttr($Model, $model['id']);
            if ($Model->create() && $Model->add()) {
                $this->success('添加' . $model['title'] . '成功！', U('lists?model=' . $model['name']));
            } else {
                $this->error($Model->getError());
            }
        } else {
            
            $fields = get_model_attribute($model['id']);
            
            $this->assign('model', $model);
            $this->assign('fields', $fields);
            $this->meta_title = '新增' . $model['title'];
            $this->display($model['template_add'] ? $model['template_add'] : '');
        }
    }

    /**
     * 模型字段校验和自动填充规则
     * @param \Think\Model $Model
     * @param int $model_id
     * @return \Think\Model
     */
    protected function checkAttr($Model, $model_id)
    {
        $fields = get_model_attribute($model_id, false);
        $validate = $auto = array();
        foreach ($fields as $key => $attr) {
            if ($attr['is_must']) { // 必填字段
                $validate[] = array(
                    $attr['name'],
                    'require',
                    $attr['title'] . '必须!'
                );
            }
            // 自动验证规则
            if (! empty($attr['validate_rule'])) {
                $validate[] = array(
                    $attr['name'],
                    $attr['validate_rule'],
                    $attr['error_info'] ? $attr['error_info'] : $attr['title'] . '验证错误',
                    0,
                    $attr['validate_type'],
                    $attr['validate_time']
                );
            }
            // 自动完成规则
            if (! empty($attr['auto_rule'])) {
                $auto[] = array(
                    $attr['name'],
                    $attr['auto_rule'],
                    $attr['auto_time'],
                    $attr['auto_type']
                );
            } elseif ('checkbox' == $attr['type']) { // 多选型
                $auto[] = array(
                    $attr['name'],
                    'arr2str',
                    3,
                    'function'
                );
            } elseif ('date' == $attr['type']) { // 日期型
                $auto[] = array(
                    $attr['name'],
                    'strtotime',
                    3,
                    'function'
                );
            } elseif ('datetime' == $attr['type']) { // 时间型
                $auto[] = array(
                    $attr['name'],
                    'strtotime',
                    3,
                    'function'
                );
            }
        }
        return $Model->validate($validate)->auto($auto);
    }
}